home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 68K / Demo / www / collectgophers.py next >
Text File  |  1996-05-20  |  2KB  |  78 lines

  1. # Collect a list of all the Gopher directories in the world.
  2. # Interrupt the program at any moment to stop, restart it later and it
  3. # will continue where it left off.
  4.  
  5. import sys
  6. import os
  7. import socket
  8. import marshal
  9. import dbm
  10. from gopherlib import *
  11.  
  12. KNOWN = '/usr/tmp/@known-gophers'
  13. TODO = '/usr/tmp/@todo-gophers'
  14. TODO_TMP = TODO + '#'
  15. TODO_OLD = TODO + '~'
  16.  
  17. ROOT = [A_DIRECTORY, 'Root', DEF_SELECTOR, DEF_HOST, DEF_PORT]
  18.  
  19. def main():
  20.     global known, todo
  21.     known = dbm.open(KNOWN, 'rw', 0666)
  22.     print len(known.keys()), 'entries known'
  23.     try:
  24.         todo = marshal.load(open(TODO, 'r'))
  25.         print len(todo), 'entries to do'
  26.     except IOError:
  27.         print 'IOError on todo, start fresh'
  28.         todo = [ROOT]
  29.     for i in range(1, len(sys.argv)): del todo[0]
  30.     i = 0
  31.     while todo:
  32.         collect(todo[0])
  33.         sys.stdout.flush()
  34.         del todo[0]
  35.         i = i+1
  36.         if i%10 != 0: continue
  37.         sys.stderr.write('Dumping ... ')
  38.         f = open(TODO_TMP, 'w')
  39.         marshal.dump(todo, f)
  40.         f.close()
  41.         ##try: os.unlink(TODO_OLD)
  42.         ##except os.error: pass
  43.         try: os.rename(TODO, TODO_OLD)
  44.         except os.error: pass
  45.         os.rename(TODO_TMP, TODO)
  46.         sys.stderr.write('done.\n')
  47.  
  48. def collect(entry):
  49.     print entry
  50.     [selector, host, port] = entry[2:5]
  51.     key = `selector, host, port`
  52.     if known.has_key(key):
  53.         print '*** already seen', known[key]
  54.         return
  55.     try:
  56.         f = send_selector(selector, host, port)
  57.         list = get_directory(f)
  58.         f.close()
  59.     except (IOError, socket.error), msg:
  60.         print '*** error:', msg
  61.         if type(msg) <> type(''):
  62.             msg = `msg`
  63.         known[key] = msg
  64.         return
  65.     print 'Got', len(list), 'subentries'
  66.     for subentry in list:
  67.         gtype = subentry[0]
  68.         if gtype == A_DIRECTORY:
  69.             [s, h, p] = subentry[2:5]
  70.             subkey = `s, h, p`
  71.             if not known.has_key(subkey):
  72.                 todo.append(subentry)
  73.         elif not '0' <= gtype <= '9':
  74.             print 'Special type:', subentry
  75.     known[key] = '' # This server is OK
  76.  
  77. main()
  78.